package br.eng.eliseu.gwt.gestaoWeb.client.ui.component;

import java.util.Comparator;

import com.google.gwt.cell.client.ButtonCell;
import com.google.gwt.cell.client.Cell;
import com.google.gwt.cell.client.CheckboxCell;
import com.google.gwt.cell.client.FieldUpdater;
import com.google.gwt.safehtml.shared.SafeHtml;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
import com.google.gwt.safehtml.shared.SafeHtmlUtils;
import com.google.gwt.user.cellview.client.Column;
import com.google.gwt.user.cellview.client.ColumnSortEvent.ListHandler;
import com.google.gwt.user.cellview.client.DataGrid;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.view.client.DefaultSelectionEventManager;
import com.google.gwt.view.client.ListDataProvider;
import com.google.gwt.view.client.MultiSelectionModel;
import com.google.gwt.view.client.ProvidesKey;
import com.google.gwt.view.client.SelectionModel;
import com.google.gwt.view.client.SingleSelectionModel;

public class SimpleDataGrid<T> extends DataGrid<T>{

	private final SelectionModel<T> selectionModel;
	private ListHandler<T> sortHandler;
	
	/**
	 * Obter o valor da célula a partir de um registro.
	 * 
	 * @param <C> tipo da celula
	 */
	public static interface GetValue<T, C> {
		C getValue(T obj);
		
	}

	public SimpleDataGrid(ProvidesKey<T> keyProvider, Boolean multSelect) {
		
		/*
	     * Defina um provedor de chave que fornece uma chave exclusiva para cada contato. 
	     * Esta a chave é usada para identificar os contatos quando os campos sao alterados
	     * Ex: nome e endereço
	     */
	    super(keyProvider);
	    
	    /*
	     * Define o manipulador que lida com a selecção do teclado/navegação.
	     */
	    setKeyboardSelectionPolicy(KeyboardSelectionPolicy.ENABLED);

		/*
	     * Não atualizar os cabeçalhos de cada vez que os dados são atualizados. O rodapé
	     * depende dos dados atual, de modo que não desativar a atualização automática no
	     * Rodapé.
	     */
	    setAutoHeaderRefreshDisabled(true);

	    // Definir a mensagem a ser exibida quando a tabela está vazia.
	    setEmptyTableWidget(new Label("Tabela vazia"));

	    // Anexar um manipulador coluna de classificação para a ListDataProvider para ordenar a lista.
		ListDataProvider<T> sortProvider = new ListDataProvider<T>(keyProvider);
		sortHandler = new ListHandler<T>(sortProvider.getList());
	    addColumnSortHandler(sortHandler);

//	    // Cria um Pager para controlar a tabela.
//	    SimplePager.Resources pagerResources = GWT.create(SimplePager.Resources.class);
//	    pager = new SimplePager(TextLocation.CENTER, pagerResources, false, 0, true);
//	    pager.setDisplay(dataGrid);

	    // Adicionar um modelo de seleção para que possamos selecionar células
	    if ( multSelect){
	    	selectionModel = new MultiSelectionModel<T>(keyProvider);
	    	setSelectionModel(selectionModel, DefaultSelectionEventManager.<T> createCheckboxManager());
	    } else {
	    	selectionModel = new SingleSelectionModel<T>(keyProvider);
	    	setSelectionModel(selectionModel, DefaultSelectionEventManager.<T> createCheckboxManager());
	    }
	    

	}

	/**
	 * Coluna de caixa de seleção. Esta vontade tabela usa uma coluna checkbox para seleção.
	 * Como alternativa, você pode chamar dataGrid.setSelectionEnabled(true) para permitir
	 * Seleção do mouse.
	 */
	public Column<T, Boolean> addColumnCheck() {
		Column<T, Boolean> checkColumn = new Column<T, Boolean>(new CheckboxCell(true, false)) {
			@Override
			public Boolean getValue(T object) {
				// Pega o valor do modelo de seleção
				return selectionModel.isSelected(object);
			}
		};
		addColumn(checkColumn, SafeHtmlUtils.fromSafeConstant("<br/>"));
		setColumnWidth(checkColumn, "2px");
	
		return checkColumn;
	}
	
	
	/**
	 * Adicione uma coluna com um cabeçalho.
	 * 
	 * @param <C>, o tipo de célula
	 * @param cell, a célula usada para processar a coluna
	 * @param headerText, string do cabeçalho
	 * @param getter, o valor getter para a celula
	 */
	public <C> Column<T, C> addColumn(String headerText, String width, Cell<C> cell, final GetValue<T, C> getter, Comparator<T> comparator) {
		Column<T, C> column = new Column<T, C>(cell) {
			@Override
			public C getValue(T object) {
				return getter.getValue(object);
			}
		};
		
		column.setSortable(true);
		sortHandler.setComparator(column, comparator);
		
		addColumn(column, headerText);
		setColumnWidth(column, width);
		return column;
	}
	
	
	public Column<T, String> addColumnEdit(FieldUpdater<T, String> fieldUpdater) {
		ButtonCell img = new ButtonCell() {
			@Override
			public void render(final Context context, final SafeHtml data, final SafeHtmlBuilder sb) {
				sb.appendHtmlConstant("<img src=\"imagens/edit.png\" />");
			}
		};

		Column<T, String> column = new Column<T, String>(img) {
			@Override
			public String getValue(T object) {
				return "edit";
			}
		};

		addColumn(column, SafeHtmlUtils.fromSafeConstant("<br/>"));
		column.setFieldUpdater(fieldUpdater);
		setColumnWidth(column, "2px");
		return column;
	}

	public Column<T, String> addColumnDelete(FieldUpdater<T, String> fieldUpdater) {
		ButtonCell img = new ButtonCell() {
			@Override
			public void render(final Context context, final SafeHtml data, final SafeHtmlBuilder sb) {
				sb.appendHtmlConstant("<img src=\"imagens/delete.png\" />");
			}
		};

		Column<T, String> column = new Column<T, String>(img) {
			@Override
			public String getValue(T object) {
				return "del";
			}
		};

		addColumn(column, SafeHtmlUtils.fromSafeConstant("<br/>"));
		column.setFieldUpdater(fieldUpdater);
		setColumnWidth(column, "2px");
		return column;
	}

}

  

